// 校验某个值是否存在于数组中
export function oneOf(value, arr) {
    if (!Array.isArray(arr)) {
        console.warn("必须传入数组")
    } else {
        return arr.includes(value);
    }
}
let arr = [undefined, undefined, null, null, NaN, NaN, '1', 1, 2, 2, 3]

// console.log(unique(arr), 'arr')
// 数组去重
export function unique(arr) {
    // 判断是否是数组
    if (!Array.isArray(arr)) {
        console.warn("传入了非数组");
        return
    }

    // 方法一：使用splice
    // 遍历数组，外层遍历元素，内层遍历比较值，如果值是相等的就使用splice删除这个值，下标减1，再次遍历
    for (var i = 0; i < arr.length; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[i] == arr[j]) {
                arr.splice(j, 1);
                j--;
            }
        }
    }
    return arr;

    // 方法二：使用 indexOf
    // 遍历当前传入的数组，判断新数组中当前值出现的下标是否是-1，是就存入新数组
    // let newArr = [];
    // for (var i = 0; i < arr.length; i++) {
    //     if (newArr.indexOf(arr[i]) === -1) {
    //         newArr.push(arr[i]);
    //     }
    // }
    // return newArr;

    // 方法三：使用includes
    // 遍历当前传入的数组，判断新数组是否包含当前值，不包含就存入新数组
    // let newArr = [];
    // for (var i = 0; i < arr.length; i++) {
    //     if (!newArr.includes(arr[i])) {
    //         newArr.push(arr[i]);
    //     }
    // }
    // return newArr;

    // 方法四：使用filter
    // 判断当前元素的下标和它在数组中第一次出现的下标是否相等
    // return arr.filter((item, index) => {
    //     return arr.indexOf(item) === index;
    // })
}

// 实现一个函数：字符串“open_door" 转成”OpenDoor“，”make_by_id" 转 “MakeById”
let str = "open_door"
    // console.log(exchangeStr(str), 'str')

var arr1 = [undefined, undefined, null, null, NaN, NaN, '1', 1, 2, 2, 3]
    // console.log(Array.from(new Set(arr1)), 'set');
    // console.log([...new Set(arr1)], 'set');

function exchangeStr(str) {
    let arr = str.split("_");
    arr.forEach((item, index, arr) => {
        arr[index] = item.substring(0, 1).toUpperCase() + item.substring(1)
        console.log(item)
    });
    return arr.join("");
}

// substing和substr的区别
// 他们都不改变原字符串
// substring(from,to) 不包含to下标
// let s = "hello";
// console.log(s.substring(1), 's') // ello ,从下标为1截取到末尾的串
// console.log(s.substring(1, 3), 'sss') // el ，从下标1截取到下标3，不包含下标3的串
//     // substr(start,length)
// console.log(s.substr(0, 1), 'substr s') // h ,从下标0开始截取长度为1的串
// console.log(s.substr(0, 8), '8') // hello, 当截取长度超过字符串长度，就截取到末尾
// console.log(s.substr(-3, 3), '-1') // llo, 当开始下标为负数，就是从字符串末尾倒数第几个开始截取指定长度
// console.log(s.substr(2), '22') // ll0 , 从下标2开始截取到字符串末尾

// js检测数据类型
// typeof
// console.log(typeof ""); // string
// console.log(typeof 1); // number
// console.log(typeof true); // boolean
// console.log(typeof null); // object
// console.log(typeof undefined); // undefined
// console.log(typeof []); // object
// console.log(typeof function() {}); // function
// console.log(typeof {}); // object

// instanceof
// console.log("1"
//     instanceof String); // false
// console.log(1 instanceof Number); // false
// console.log(true instanceof Boolean); // false
// console.log([] instanceof Array); // true
// console.log(function() {}
//     instanceof Function); // true
// console.log({}
//     instanceof Object); // true
// console.log(null instanceof null) // 报错
// console.log(undefined instanceof undefined) // 报错
// constructor
// console.log(("1").constructor === String); // true
// console.log((1).constructor === Number); // true
// console.log((true).constructor === Boolean); // true
// console.log(([]).constructor === Array); // true
// console.log((function() {}).constructor === Function); // true
// console.log(({}).constructor === Object); // true
// console.log((null).constructor === null); // 报错
// console.log((undefined).constructor === undefined); // 报错

// function fn() {}
// fn.prototype = new Array()
// let f = new fn()
// console.log(f.constructor === fn) // false
// console.log(fn.constructor === fn) // false
// console.log(fn.constructor === Function) // true
// console.log(f.constructor === Array) // true

// Object.prototype.toString.call()
// var test = Object.prototype.toString;

// console.log(test.call("str")); // [object String]
// console.log(test.call(1)); // [object Number]
// console.log(test.call(true)); // [object Boolean]
// console.log(test.call(null)); // [object Null]
// console.log(test.call(undefined)); // [object Undefined]
// console.log(test.call([])); // [object Array]
// console.log(test.call(function() {})); // [object Function]
// console.log(test.call({})); // [object Object]


// function fun() {};

// fun.prototype = new Array();

// let f = new fun();

// console.log(Object.prototype.toString.call(fun)) // [object Function]
// console.log(Object.prototype.toString.call(f)) // [object Object]
// let obj = { name: 111 }

// function fn() {
//     console.log(this.name)
// }
// fn.call(obj); // 111

// promise
// let p1 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//         // reject("123")
//         resolve("123")
//         console.log('p1')
//     }, 3000)
// })
// let p2 = new Promise((resolve, reject) => {
//     // console.log('p2')
//     setTimeout(() => {
//         // resolve("456")
//         reject("456")
//         console.log('p2')
//     }, 2000)
// })
// let p = Promise.all([p1, p2]).then(res => {
//     console.log(res, 'res')
// }).catch(error => {
//     console.log(error, 'error')
// })

// 扩展运算符
// 复制
// var arr1 = ['hello']
// var arr2 = [...arr1]
// arr1 = ['baye']
// console.log(arr1, 'arr1') // baye
// console.log(arr2, 'arr2') // hello
// var obj1 = { name: "lili" }
// var obj2 = {...obj1 }
// obj1 = { name: "zs" }
// console.log(obj1, 'obj1') // zs
// console.log(obj2, 'obj2') // lili
//     // 合并
// var arr1 = ['hello']
// var arr2 = ['word']
// console.log([...arr1, ...arr2]) // ['hello','word']
// var obj1 = { name: "lili" }
// var obj2 = { age: 18 }
// console.log({...obj1, ...obj2 }) // {name:"lili",age:18}
//     // 字符串转成数组
// var str1 = '1234567'
// console.log([...str1]) // ["1", "2", "3", "4", "5", "6", "7"]

// 获取年月日
export function getYearMonthDay(date) {
    let year = date.getFullYear()
    let month = date.getMonth()
    let day = date.getDate()
    return { year, month, day }
}

// 获取某年的某个月的某一天
export function getDate(year, month, day) {
    return new Date(year, month, day);
}